/**
 * <pre>
 * 转自：http://uule.iteye.com/blog/1488356 
 * 
 * 
 * 关于互斥锁：
所谓互斥锁, 指的是一次最多只能有一个线程持有的锁. 在jdk1.5之前, 我们通常使用synchronized机制控制多个线程对共享资源的访问. </br>
而现在, Lock提供了比synchronized机制更广泛的锁定操作, Lock和synchronized机制的主要区别:</br>
synchronized机制提供了对与每个对象相关的隐式监视器锁的访问, 并强制所有锁获取和释放均要出现在一个块结构中, </br>
当获取了多个锁时, 它们必须以相反的顺序释放. synchronized机制对锁的释放是隐式的, 只要线程运行的代码超出了synchronized语句块范围,</br>
 锁就会被释放. 而Lock机制必须显式的调用Lock对象的unlock()方法才能释放锁, 这为获取锁和释放锁不出现在同一个块结构中, 以及以更自由的顺序释放锁提供了可能.</br>
 * </pre>
 * 
 * 
 * 关于可重入： 
一、2.4.1 内部锁
Java 提供了原子性的内置锁机制： sychronized 块。它包含两个部分：锁对象的引用和这个锁保护的代码块：
synchronized(lock) {
// 访问或修改被锁保护的共享状态
}
内部锁扮演了互斥锁（ mutual exclusion lock, 也称作 mutex ）的角色，一个线程拥有锁的时候，别的线程阻塞等待。
 
2.4.2 重进入（Reentrancy ）
重入性：指的是同一个线程多次试图获取它所占有的锁，请求会成功。当释放锁的时候，直到重入次数清零，锁才释放完毕。
Public class Widget {
      Public synchronized void doSomething(){
           …
      }
}
Public class LoggingWidget extends Widget {
   Public synchronized void doSomething(){
      System.out.println(toString()+”:calling doSomething”);
      Super.doSomething();
   }
}
 */
/**
 * @author jackson.zhang
 *什么时候选择用 ReentrantLock 代替 synchronized</br>
既然如此，我们什么时候才应该使用 ReentrantLock 呢？</br>
答案非常简单 —— 在确实需要一些 synchronized 所没有的特性的时候，</br>
比如时间锁等候、可中断锁等候、无块结构锁、多个条件变量或者锁投票。 </br>
ReentrantLock 还具有可伸缩性的好处，应当在高度争用的情况下使用它，</br>
但是请记住，大多数 synchronized 块几乎从来没有出现过争用，所以可以把高度争用放在一边。</br>
我建议用 synchronized 开发，直到确实证明 synchronized 不合适，</br>
而不要仅仅是假设如果使用 ReentrantLock “性能会更好”。</br>
请记住，这些是供高级用户使用的高级工具。（而且，真正的高级用户喜欢选择能够找到的最简单工具，</br>
直到他们认为简单的工具不适用为止。）。一如既往，首先要把事情做好，然后再考虑是不是有必要做得更快。</br>
 */
package com.jdk.thread.lock;
